﻿
//每次选择完文件都需要将文件存起来 并且
//支持FormData和Form提交2种方式
; (function ($) {
    $.fn.Uploads = function (options) {
        var defaults = {
            before: null, //提交之前 , 一般用于选择后显示预览文件的
            complate: null, //完成之后 不管成功与否
            subtn: null, //提交按钮 $(".btn")  jq对象
            onselect:null, //选择文件后的回调
            process: null, //上传进度 
            error: null, //错误回调
            success: null, // 上传成功回调
            stopbtn: null, // 停止按钮
            stop: null,//停止回调
            url: "",//提交上传文件的处理程序
            folder: "",//上传存在的文件夹 , 如果为空 则为后台配置的上传路径 , 如果不为空格式为 channel/image
            safecode: "",//安全码 , 用于验证防止恶意上传
            allowextname:"",
            tips: function (t) { return t; }
        }
        var ops = $.extend(defaults, options);
        
        var Tip = {
            noFile: "请选择要上传的文件",
        };

        /*检测是否支持FormData*/
        function isFormData() {
            try {
                new FormData();
                return true;
            } catch (e) {
                return false;
            }
        }

        function throwError(msg) {
            throw new Error(msg);
        }

        if (ops.url == "") {
            throwError("未配置上传文件的处理程序");
        }
        if ($(this)[0].type != "file") {
            throwError("插件必须初始化file对象");
        }
        

        var fileList;
        var formData;
        var xhr;
        var successFileList = new Array(); // 上传成功文件列表
        var fieldFileList = new Array(); //上传失败文件列表
        var upFileLength = 0; //已处理的文件个数
        var _this = $(this);
        var _field = $(this).attr("class");
        //console.log(_this.files,1)
        /*检测是不是IE6789 严重鄙视*/
        function ckIE() {
            var agent = window.navigator.userAgent;
            var isIE7 = agent.indexOf('MSIE 7.0') != -1;
            var isIE8 = agent.indexOf('MSIE 8.0') != -1;
            var isIE9 = agent.indexOf('MSIE 9.0') != -1;
            return isIE9 || isIE8 || isIE7;
        }
        /*重置变量 , 在即将上传的时候*/
        function reSet() {
            formData = isFormData() ? new FormData() : null;
            successFileList = new Array(); // 上传成功文件列表
            fieldFileList = new Array(); //上传失败文件列表
            upFileLength = 0; //已处理的文件个数
            if (ckIE()) { fileList = _this[0].value == "" ? 0 : 1; }
            else { fileList = _this[0].files; }
        }
        /*重置文件选择框*/
        function reSetInput() {
            var ie = !-[1, ]; //判断是否IE
            if (ie) {
                _this.replaceWith(_this.clone(true));
            } else {
                _this.val('');
            }
        }

        function getFileExtName(str)
        {
            str.split('.');
            return false;
        }

        function getFileName(str) {
            str.split('\\')
            if (str) {
                str.split('\\')
            } else {
                return "";
            }
        }
        //事件触发上传入口
        function loadFileList() {
            reSet();
            if (ops.before) {
                ops.before(fileList,_field);
            }
            if (ckIE()) {
                if (fileList > 0) { upload_Old(); }
                else { ops.tips(Tip.noFile); }
            }
            else {
                if (fileList.length > 0) { upload(); }
                else { ops.tips(Tip.noFile); }
            }

        }

        if (ops.subtn) {
            //如果有上传按钮 点击上传开始
            ops.subtn.on("click", function () {
                loadFileList();
            });
            //如果有选择后的回调  就加上回调
            
            _this.off("change.upload").on("change.upload", function () {
                if (ops.onselect) {
                    reSet();
                    ops.onselect(fileList);
                }
            });
        }
        else {
            //没有上传按钮 选择后就开始
            
            _this.off("change.upload").on("change.upload", function () {
                
                if (ops.onselect) {
                    reSet();
                    ops.onselect(fileList);
                }
                loadFileList();
            });
        }

        function resetXhr() {
            xhr = null;
            if (window.XMLHttpRequest) {// for all new browsers
                xhr = new XMLHttpRequest();
            }
            else if (window.ActiveXObject) {// for IE5 and IE6
                xhr = new ActiveXObject("Microsoft.XMLHTTP");
            }
        }

        //console.log(_this[0], 1)
        /*模拟Form表单上传 IE8,9 不支持多文件上传*/
        function upload_Old() {
            resetXhr();
            //上传入口  组装FormData
            function markFormdata() {
                formData = _this[0];
                startUpload(formData);
            }
            //上传完成后执行的函数 判断是否还有文件等等
            function UploadFinish() {
                upFileLength++; //下标+1
                //判断是否还有文件
                if (upFileLength <= fileList - 1) {
                    markFormdata();
                } else {
                    //全部处理完成
                    //console.log(successFileList);
                    reSetInput();
                }
            }

            //上传函数
            function startUpload(formdata) {
                //console.log(formdata, xhr);
                xhr.open('POST', ops.url, true);
                xhr.setRequestHeader("isFormData", "0");
                xhr.setRequestHeader("SafeCode", ops.safecode);
                xhr.setRequestHeader("Folder", ops.folder);
                //xhr.setRequestHeader("FileType", "png");
                //xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
                xhr.send(formdata);
            }
            markFormdata();
        }

        /*使用FormData对象上传*/
        function upload() {
            resetXhr();
            //上传入口  组装FormData
            function markFormdata() {
                formData = new FormData();
                formData.append("upload_" + upFileLength, fileList[upFileLength]);
                startUpload(formData);
            }
            //上传完成后执行的函数 判断是否还有文件等等
            function UploadFinish() {
                upFileLength++; //下标+1
                //判断是否还有文件
                if (upFileLength <= fileList.length - 1) {
                    markFormdata();
                } else {
                    //全部处理完成
                    //console.log(successFileList);
                    if (ops.success) {
                        ops.success(true, successFileList, upFileLength, _field);
                    }
                    reSetInput();
                    if (ops.complate) {
                        ops.complate(_field);
                    }
                    isStop = false;
                }
            }

            //上传函数
            function startUpload(formdata) {
                //console.log("2222");
                //监听上传进度
                xhr.upload.onprogress = function (event) {
                    //当开始有文件大小的时候在计算
                    if (event.lengthComputable) {
                        //计算百分比
                        if (ops.process) {
                            var percent = Math.round(event.loaded * 100 / event.total); //计算百分比
                            ops.process(percent, upFileLength + 1, fileList, _field); // 上传进度回调 1进度 2上传的文件是第几个
                        }
                    }
                }
                //开始上传的时候
                xhr.onloadstart = function (event) {
                    //console.log("upload开始");
                    //如果有停止按钮
                    if (ops.stopbtn) {
                        ops.stopbtn.one("click", function () {
                            xhr.abort();
                        })
                    }
                }
                //上传成功
                xhr.onload = function (event) {

                    if ((xhr.responseText).startsWith("ERROR=")) {
                        if (ops.error) {
                            ops.error(xhr.responseText, upFileLength, _field);
                        }
                        fieldFileList.push(xhr.responseText);
                    } else {
                        ///console.log(xhr.responseText);
                        if (ops.success) {
                            ops.success(false, xhr.responseText, upFileLength, _field);
                        }
                        successFileList.push(xhr.responseText);
                    }
                }
                xhr.onerror = function (event) {
                }
                //上传完成  不管成功与否都会触发
                xhr.onloadend = function (event) {
                    //console.log("完成");
                    UploadFinish();
                }
                xhr.onabort = function (event) {
                    //console.log("上传取消");
                }
                xhr.open('POST', ops.url, true);
                xhr.setRequestHeader("isFormData", "1");
                xhr.setRequestHeader("SafeCode", ops.safecode);
                xhr.setRequestHeader("Folder", ops.folder);
                xhr.send(formdata);
            }
            markFormdata();
        }
        //console.log(ops.subtn, $(this)[0].files, $(this)[0].type);
        return ops;
    }
})(jQuery);